// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.geocities.com/kpdus/jad.html // Decompiler options: braces fieldsfirst space lnc package com.google.gson.reflect; import java.lang.reflect.GenericArrayType; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; import java.util.HashMap; import java.util.Map; public class TypeToken { final int hashCode; final Class rawType; final Type type; protected TypeToken() { type = getSuperclassTypeParameter(getClass()); rawType = com.google.gson.internal..Gson.Types.getRawType(type); hashCode = type.hashCode(); } TypeToken(Type type1) { type = com.google.gson.internal..Gson.Types.canonicalize((Type)com.google.gson.internal..Gson.Preconditions.checkNotNull(type1)); rawType = com.google.gson.internal..Gson.Types.getRawType(type); hashCode = type.hashCode(); } private static transient AssertionError buildUnexpectedTypeError(Type type1, Class aclass[]) { StringBuilder stringbuilder = new StringBuilder("Unexpected type. Expected one of: "); int i = aclass.length; for (int j = 0; j < i; j++) { stringbuilder.append(aclass[j].getName()).append(", "); } stringbuilder.append("but got: ").append(type1.getClass().getName()).append(", for type token: ").append(type1.toString()).append('.'); return new AssertionError(stringbuilder.toString()); } public static TypeToken get(Class class1) { return new TypeToken(class1); } public static TypeToken get(Type type1) { return new TypeToken(type1); } static Type getSuperclassTypeParameter(Class class1) { Type type1 = class1.getGenericSuperclass(); if (type1 instanceof Class) { throw new RuntimeException("Missing type parameter."); } else { return com.google.gson.internal..Gson.Types.canonicalize(((ParameterizedType)type1).getActualTypeArguments()[0]); } } private static boolean isAssignableFrom(Type type1, GenericArrayType genericarraytype) { Type type2 = genericarraytype.getGenericComponentType(); if (!(type2 instanceof ParameterizedType)) goto _L2; else goto _L1 _L1: if (!(type1 instanceof GenericArrayType)) goto _L4; else goto _L3 _L3: type1 = ((GenericArrayType)type1).getGenericComponentType(); _L5: return isAssignableFrom(type1, (ParameterizedType)type2, ((Map) (new HashMap()))); _L4: if (type1 instanceof Class) { type1 = (Class)type1; while (type1.isArray()) { type1 = type1.getComponentType(); } } if (true) goto _L5; else goto _L2 _L2: return true; } private static boolean isAssignableFrom(Type type1, ParameterizedType parameterizedtype, Map map) { int i = 0; if (type1 == null) { return false; } if (parameterizedtype.equals(type1)) { return true; } Class class1 = com.google.gson.internal..Gson.Types.getRawType(type1); ParameterizedType parameterizedtype1; Type atype[]; if (type1 instanceof ParameterizedType) { parameterizedtype1 = (ParameterizedType)type1; } else { parameterizedtype1 = null; } if (parameterizedtype1 != null) { Type atype1[] = parameterizedtype1.getActualTypeArguments(); TypeVariable atypevariable[] = class1.getTypeParameters(); for (int k = 0; k < atype1.length; k++) { Type type2 = atype1[k]; TypeVariable typevariable = atypevariable[k]; for (; type2 instanceof TypeVariable; type2 = (Type)map.get(((TypeVariable)type2).getName())) { } map.put(typevariable.getName(), type2); } if (typeEquals(parameterizedtype1, parameterizedtype, map)) { return true; } } atype = class1.getGenericInterfaces(); for (int j = atype.length; i < j; i++) { if (isAssignableFrom(atype[i], parameterizedtype, ((Map) (new HashMap(map))))) { return true; } } return isAssignableFrom(class1.getGenericSuperclass(), parameterizedtype, ((Map) (new HashMap(map)))); } private static boolean matches(Type type1, Type type2, Map map) { return type2.equals(type1) || (type1 instanceof TypeVariable) && type2.equals(map.get(((TypeVariable)type1).getName())); } private static boolean typeEquals(ParameterizedType parameterizedtype, ParameterizedType parameterizedtype1, Map map) { if (!parameterizedtype.getRawType().equals(parameterizedtype1.getRawType())) goto _L2; else goto _L1 _L1: Type atype[]; Type atype1[]; int i; atype = parameterizedtype.getActualTypeArguments(); atype1 = parameterizedtype1.getActualTypeArguments(); i = 0; _L5: if (i >= atype.length) { break; /* Loop/switch isn't completed */ } if (matches(atype[i], atype1[i], map)) goto _L3; else goto _L2 _L2: return false; _L3: i++; if (true) goto _L5; else goto _L4 _L4: return true; } public final boolean equals(Object obj) { return (obj instanceof TypeToken) && com.google.gson.internal..Gson.Types.equals(type, ((TypeToken)obj).type); } public final Class getRawType() { return rawType; } public final Type getType() { return type; } public final int hashCode() { return hashCode; } public boolean isAssignableFrom(TypeToken typetoken) { return isAssignableFrom(typetoken.getType()); } public boolean isAssignableFrom(Class class1) { return isAssignableFrom(((Type) (class1))); } public boolean isAssignableFrom(Type type1) { if (type1 == null) { return false; } if (type.equals(type1)) { return true; } if (type instanceof Class) { return rawType.isAssignableFrom(com.google.gson.internal..Gson.Types.getRawType(type1)); } if (type instanceof ParameterizedType) { return isAssignableFrom(type1, (ParameterizedType)type, ((Map) (new HashMap()))); } if (type instanceof GenericArrayType) { boolean flag; if (rawType.isAssignableFrom(com.google.gson.internal..Gson.Types.getRawType(type1)) && isAssignableFrom(type1, (GenericArrayType)type)) { flag = true; } else { flag = false; } return flag; } else { throw buildUnexpectedTypeError(type, new Class[] { java/lang/Class, java/lang/reflect/ParameterizedType, java/lang/reflect/GenericArrayType }); } } public final String toString() { return com.google.gson.internal..Gson.Types.typeToString(type); } }